perm filename SAVE.THS[S,DOC] blob
sn#100622 filedate 1974-05-03 generic text, type T, neo UTF8
TITLE SPYDER
TTY== 0 ;I/O CHANNEL FOR TTY
T1== 1 ;GENERAL PURPOSE ACS
T2== 2
T3== 3
T4== 4
T5== 5
T6== 6
T7== 7
T10== 10
NAME= 11 ;OUR CURRENT JOB NAME
THSTTY==12 ;LAST TTY# DISPLAYED
CHAR== 13 ;I/O COMMUNICATION
FLAG== 14 ;LH = I/O CHNLS, RH=FLAGS
THSCNL==15 ;I/O CHANNEL COMMUNICATION
P= 17 ;PUSHDOWN LIST POINTER
PDSIZ== 20 ;VALUES
ASCLIN==1
.JBINT==134
VALID== 1 ;FLAGS
TTYDPY==2
NODPY== 4
LOGCMD==10
OFFLOG==20
UPDATE==40
FPD== 100
LOC .JBINT
INTBLK
RELOC
INTBLK: 4,,CNTRLC
2
BLOCK 2
CNTRLC: TYPEC ARRGH; ;↑C TRAPPING
EXIT 1, ;BE NICE
MOVEM T1,TMP# ;BUT ALLOW CONTINUE
SETZ T1,
EXCH T1,INTBLK+2
EXCH T1,TMP ;WHERE SHE STOPS...
JRSTF @TMP
ST: RESET ;FORCE OF HABIT
TYPEC ;ISSUE A CRLF FOR MOTHER
HRROI T1,6
GETTAB T1, ;WHAT KIND OF PRIVS HAVE WE?
TYPEC %GETTAB FAILURE 1; ;SIGH...
MOVEI T2,41
PEEK T2, ;CAN WE PEEK?
JUMPE T2,[ERRT ?NO PRIVS,14,T1]
MOVE NAME,[SIXBIT/SPYDER/] ;THAT'S US
MOVE P,[IOWD PDSIZ,PDLIST] ;INITIALIZE PDLST
SETZB FLAG,DPY ;HO HUM
SETO THSTTY,
MOVE T1,[DPY,DPY+1] ;CLEAR DPY & LOG FLAGS
BLT T1,LOG+2 ;IN CORE, OF COURSE
INIT TTY,ASCLIN ;TTY IS INITED BECAUSE
'TTY ' ;PROG MUST NOT BE HUNG IN
OUTBUF,,0 ;TO, SO LARGE BUFFER RING
ERR ?NO TTY; ;PROVIDES LEEWAY
TLO FLAG,(1B0) ;MARK CH 0 IN USE
OUTBUF TTY,20 ;BREATHING SPACE
SETO T1,
GETLCH T1 ;GRAB BITS
TLO T1,(1B15) ;SET NO ECHO BIT
SETLCH T1 ;TELL THE MONITOR
ANDI T1,177777 ;SHUT OFF GARBAGE
MOVEM T1,MYTTY# ;BUT SAVE THE VITALS
MOVE T1,[30,,11]
GETTAB T1, ;FIND ADDRESS OF 1ST TTY CHUNK
ERR ?GETTAB ERROR 2
HRRZM T1,CHBASE#
MOVE T1,[33,,11] ;FIND BASE ADDRESS OF LDB
GETTAB T1, ;TABLE (INDEXED BY LINE)
ERR ?GETTAB ERROR 3
HRRZM T1,LINES#
HLRE T1,T1 ;LH IS MAX # OF TTYS IN SYSTEM
MOVMS T1 ;MAKE IT POSITIVE
SUBI T1,1 ;FUDGE FACTOR
MOVEM T1,MAXTTY#
MOVE T1,[CHNLS,,CHNLS+1]
SETZM CHNLS
BLT T1,CHNLS+17 ;ZERO TTY TO CHNL TABLE
SETZM ARGIN# ;INITIALIZE FOR CMD SCNR
MOVE T1,CHUNK ;COMPUTE LAST DIGIT
IDIVI T1,10 ;OF ADDRESSES OF HEADER
CAIL T2,4 ;WORDS OF TTY CHUNKS
SUBI T2,4 ;COULD ALSO BE X+4
MOVEM T2,FUDGE#
TYPEC READY ;TELL READY AND FALL INTO LOOP
LOOP: MOVE T1,ARGIN ;CONT SCANNING LAST COMMAND
GRBCHR: INCHRS CHAR ;READ A CHARACTER
JRST NOCHRS ;SIGH
CAIE CHAR,175
CAIN CHAR,176
JRST CMDELI ;A DELIMITER! END OF CMD..
CAIN CHAR,33 ;MUSN'T FORGET ALL ALTS
JRST CMDELI
CAIL CHAR,"0"
CAIL CHAR,"9"+1
JRST DELIM ;NOT A DIGIT...MAYBE OK
TRON FLAG,VALID ;A DIGIT IS ALWAYS WELCOME
TRO FLAG,TTYDPY ;IF NOTHING ELSE, DEFAULT
LSH T1,3 ;MAKE ROOM FOR NEXT DIGIT
ADDI T1,-60(CHAR) ;ADD IT IN DISGUSTINGLY
JRST GRBCHR ;AND GO BACK FOR MORE
DELIM: CAIN CHAR,"+" ;DISPLAY A TTY?
JRST [ ;;YES! SET FLAGS
TRCE FLAG,VALID
JRST BADCMD
TRO FLAG,TTYDPY
JRST GRBCHR]
CAIN CHAR,"-" ;REMOVE A TTY FROM DISPLAY?
JRST [
TRCE FLAG,VALID
JRST BADCMD
TRO FLAG,NODPY
JRST GRBCHR]
CAIN CHAR,"/" ;MAYBE WE SHOULD START LOGGING
JRST [
TRCE FLAG,VALID
JRST BADCMD
TRO FLAG,LOGCMD
JRST GRBCHR]
CAIN CHAR,"\" ;LAST CHANCE! STOP LOGGING?
JRST [
TRCE FLAG,VALID
JRST BADCMD
TRO FLAG,OFFLOG
JRST GRBCHR]
BADCMD: MOVEI CHAR,7 ;OOPS - YOU LOSE
OUTCHR CHAR ;RING BELL TO COMPLAIN
CLRBFI
TRZ FLAG,VALID ;CLEAR UP A DELUSION
SETZB T1,ARGIN ;WASH WALLS
JRST GRBCHR ;AND TRY AGAIN
CMDELI: TRZN FLAG,VALID ;DID WE LIKE THIS ONE?
JRST BADCMD ;OH WELL, TOO BAD
SETZM ARGIN ;CLEAN UP FOR NEXT TIME
CAMG T1,MAXTTY ;WAS THE NUMBER REASONABLE?
CAMN T1,MYTTY
JRST BADCMD ;NOT HARDLY
JUMPL T1,BADCMD ;THAT WOULD BE BIZZARE
TRZE FLAG,TTYDPY ;SKIP TO REMEMBER COMMAND
JRST NEWDPY
TRZE FLAG,NODPY
JRST REMDPY
TRZE FLAG,LOGCMD
JRST LOGIN
TRZE FLAG,OFFLOG
JRST LOGOUT
ERR %NO COMMAND GIVEN,LOOP
NOCHRS: MOVEM T1,ARGIN ;SAVE PARTIAL COMMAND
LFIN: PUSHJ P,DSPLYR ;UPDATE TTY
PUSHJ P,LOGGER ;UPDATE LOG FILES
TLC NAME,20 ;NEW ALIAS
SETNAM NAME,
MOVEI T1,1
SLEEP T1, ;ZZZZZZZZZZZZZZZZZZZZZZ
TRZE FLAG,UPDATE ;DID WE DO ANYTHING?
JRST LOOP ;YES...FINE
MOVEI CHAR,7 ;NO..COMPLAIN SO SLEEP TIME
OUTCHR CHAR ;CAN BE INCREASED
JRST LOOP ;THEN TRY AGAIN
NEWDPY: PUSHJ P,FIND ;ADDS TTY TO DISPLAY
HRRM T2,TWHERE(T1) ;STORE BP TO 1ST CHAR (INP)
MOVEI THSCNL,TTY ;IT'S TTY I/O TIME
MOVEI CHAR,CRLPAR
PUSHJ P,SEND ;FORMATTING
OCTSND 0,T1 ;PRINT TTY#
MOVEI CHAR,IPAR
PUSHJ P,SEND ;TELL INPUT FOLLOWS
PUSHJ P,FINDA ;SEND ALL WE CAN FIND
HRLM T2,TWHERE(T1) ;BP TO 1ST CHAR (OUTPUT)
MOVEI CHAR,CRLPAR ;SAME STORY
PUSHJ P,SEND
OCTSND 0,T1
MOVEI CHAR,OPAR
PUSHJ P,SEND
PUSHJ P,FINDB ;PURGE OUTPUT BUFFER TO TTY
MOVE THSTTY,T1 ;REMEMBER WHO WE SENT LAST
MOVE T2,T1 ;SET THIS TTY'S DISPLAY FLAG
IDIVI T2,44
MOVE T4,DPY(T2)
ROT T4,1(T3)
TRO T4,1
MOVNS T3
ROT T4,-1(T3)
MOVEM T4,DPY(T2)
JRST LFIN ;GO FINISH MAIN LOOP
REMDPY: MOVE T2,T1 ;REMOVES A TTY FROM DISPLAY
IDIVI T2,44 ;ALL YOU NEED TO DO IS
MOVE T4,DPY(T1) ;CLEAR ITS DISPLAY BIT
ROT T4,1(T3)
TRZ T4,1
MOVNS T3
ROT T4,-1(T3)
MOVEM T4,DPY(T2)
JRST LFIN ;AND THENCE TO GREECE
LOGIN: MOVE T2,T1 ;ADDS TTY TO LOGGER
IDIVI T2,44 ;FIRST, CHECK IF TTY IS ON
MOVE T4,LOG(T2) ;ALREADY
LSH T4,1(T3)
TRNE T4,1
ERRT %ALREADY LOGGING,0,T1,BADCMD
MOVSI T2,-17 ;NOW, TRY TO FIND A FREE CNL
FREFND: ROT FLAG,1 ;BY CHECKING LH OF FLAG
TROE FLAG,1
JRST FRECNL
AOBJN T2,FREFND
CTYPEC %NO FREE CHANNELS; ;GREEDY, ISN'T HE?
JRST BADCMD
FRECNL: HRRZ THSCNL,T2 ;SAVE THE # OF THE FREE CHNL
MOVNI T2,(T2) ;RESTORE FLAG REGISTER
ROT FLAG,-1(T2)
MOVE T2,THSCNL ;SETUP OPEN BLOCK
IMULI T2,3 ;SPECIFICALLY, THE BUF HDR
MOVEI T2,OUTBUF(T2)
HRLZM T2,OPNBLK+2
MOVE T2,THSCNL ;CALCULATE OPEN INSTRUCTION
LSH T2,27
ADD T2,[OPEN OPNBLK]
XCT T2 ;DISGUSTING, ISN'T IT?
ERRT %DISK OPEN FAILURE ON CHNL,0,THSCNL,BADCMD
MOVEI T2,177 ;NOW CALCULATE FILENAME
SUB T2,THSCNL ;FNAM= 177-TTY#
MOVEI T4,222000 ;FOR A LITTLE OBSCURITY
SETZ T3, ;CONVERT TO SIXBIT
REPEAT 3,<
ROTC T2,-3
ROTC T3,-3>
MOVEM T3,.+4 ;PUT FILENAME IN LKP BLOCK
FILSET 3,<0,FILENM,TMP>
MOVE T2,THSCNL
LSH T2,27
ADD T2,[LOOKUP FILE]
XCT T2 ;LOOKUP FILE
PUSHJ P,ANYWAY ;IF NOT THERE, CREATE & LKP
MOVEM T3,.+4 ;NOW DO ENTER FOR UPDATE MODE
FILSET 4,<0,FILENM,TMP,<777000,,0>>
MOVE T2,THSCNL ;PROTECT IT WELL
LSH T2,27
ADD T2,[ENTER FILE]
XCT T2 ;ENTER DISGUSTINGLY
ENTERR
MOVE T2,THSCNL ;NOW DO USETI TO APPEND
LSH T2,27
ADD T2,[USETI -1]
XCT T2 ;I HATE THIS..
MOVEI CHAR,[ASCIZ/
*************
(/]
PUSHJ P,SEND ;TO SEPERATE ENTRIES
OCTSND 0,T1
MOVEI CHAR,IPAR
PUSHJ P,SEND ;NOW THAT IT'S FORMATTED..
PUSHJ P,FIND ;DUMP THE INPUT BUFFER
HRRM T2,DWHERE(T1)
PUSHJ P,FINDA
HRLM T2,DWHERE(T1)
MOVEI CHAR,CRLPAR ;MORE FORMATTING
PUSHJ P,SEND
OCTSND 0,T1
MOVEI CHAR,OPAR
PUSHJ P,SEND
PUSHJ P,FINDB ;DUMP OUTPUT BUFFER
MOVEI CHAR,STARS ;NOW MARK ST OF ON-LINE
PUSHJ P,SEND
MOVE T2,T1 ;SET LOGGING BIT FOR THIS TTY
IDIVI T2,44
MOVE T4,LOG(T2)
ROT T4,1(T3)
TRO T4,1
MOVNS T3
ROT T4,-1(T3)
MOVEM T4,LOG(T2)
MOVEM T1,CHNLS(THSCNL) ;REMEMBER TTY ON THIS CHANNEL
JRST LFIN ;AND GO FLY A KITE